"""


"""
from flask import current_app
from flask import g, jsonify
from flask import request
from flask import session

from info import constants
from info import db
from info.models import News, Category
from info.utils.common import get_login_data
from info.utils.qiniu_storage import storage
from info.utils.response_code import RET
from . import profile_blu
from flask import render_template, redirect


@profile_blu.route("/info")
@get_login_data
def info():
    """负责渲染 user.html页面"""

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    data = {
        "user_info": user.to_dict() if user else None
    }
    return render_template("news/user.html", data=data)


@profile_blu.route("/base_info", methods=["POST", "GET"])
@get_login_data
def base_info():
    """
    1、可以渲染基本资料页面  user_base_info.html
    2、还可以处理 修改昵称、性别 这个请求

    步骤实现(POST) :
    1、获取参数，判空
    2、修改模型用户的数据 、提交
    3、修改session中曾经保存的数据
    4、返回成功
    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    if request.method == "GET":
        data = {
            "user_info": user.to_dict() if user else None
        }
        return render_template("news/user_base_info.html", data=data)

    #1、获取参数，判空
    data_dict = request.json
    signature = data_dict.get("signature")
    nick_name = data_dict.get("nick_name")
    gender = data_dict.get("gender")
    if not all([signature, nick_name, gender]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")
    if gender not in ("MAN", "WOMAN"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # 2、修改模型用户的数据 、提交
    user.signature = signature
    user.nick_name = nick_name
    user.gender = gender
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")
    # 3、修改session中曾经保存的数据
    session["nick_name"] = nick_name
    # 4、返回成功
    return jsonify(errno=RET.OK, errmsg="保存成功")


@profile_blu.route("/pic_info", methods=["POST", "GET"])
@get_login_data
def pic_info():
    """
    1、可以渲染基本资料页面  user_pic_info.html
    2、还可以处理 上传图片 这个请求

    步骤实现(POST) :

    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    if request.method == "GET":
        data = {
            "user_info": user.to_dict() if user else None
        }
        return render_template("news/user_pic_info.html", data=data)

    # 1.获取参数(上传的文件)
    try:
        avatar_file = request.files.get("avatar").read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")

    # 2.把文件上传到七牛云
    try:
        avatar_url = storage(avatar_file)  # 返回图片url，我们将来把他保存到数据库
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="七牛云错误")

    # 3.把头像信息更新到当前用户的模型中
    user.avatar_url = avatar_url
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")

    data = {
        "avatar_url": constants.QINIU_DOMIN_PREFIX + avatar_url
    }
    # 4.返回上传的结果(带上图片url返回给前端)
    return jsonify(errno=RET.OK, errmsg="保存成功", data=data)


@profile_blu.route("/pass_info", methods=["POST", "GET"])
@get_login_data
def pass_info():
    """
    渲染修改密码页面   GET
    处理修改密码请求  POST

    1、获取参数  (旧密码， 新密码*2)
    2、判空，校验     判空 、两密码是否一直、查询数据库
    3、修改密码 提交
    4、返回结果
    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    if request.method == "GET":
        data = {
            "user_info": user.to_dict() if user else None
        }
        return render_template("news/user_pass_info.html", data=data)

    # 1、获取参数(旧密码， 新密码 * 2)
    data_dict = request.json
    old_password = data_dict.get("old_password")
    new_password = data_dict.get("new_password")
    new_password2 = data_dict.get("new_password2")
    # 2、判空，校验   判空 、两密码是否一直、查询数据库
    if not all([old_password, new_password, new_password2]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if new_password != new_password2:
        return jsonify(errno=RET.PARAMERR, errmsg="两次密码不一致")
    if not user.check_passowrd(old_password):
        return jsonify(errno=RET.PWDERR,errmsg="密码错误")
    # 3、修改密码提交
    user.password = new_password
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")
    # 4、返回结果
    return jsonify(errno=RET.OK, errmsg="操作成功")


@profile_blu.route("/collection_news", methods=["GET"])
@get_login_data
def collection_news():
    """
    渲染收藏新闻页面   GET


    1、获取参数、校验参数
    2、查询数据库 分页查询  user.collection_news
    3、新闻数据模型对象列表转换成字典列表
    4、返回数据 ：  新闻字典里列表、 总页数、当前页
    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    # 1、获取参数、校验参数
    p = request.args.get("p", 1)
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1


    # 2、查询数据库分页查询user.collection_news
    cur_coll_news = []
    current_page = 1
    total_page = 1
    try:
        paginate = user.collection_news.paginate(p, constants.USER_NEWS_PAGE_MAX_COUNT, False)
        cur_coll_news = paginate.items  # 当前页数据
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    # 3、新闻数据模型对象列表转换成字典列表
    cur_coll_news_list = []
    for i in cur_coll_news:
        cur_coll_news_list.append(i.to_dict())

    # 4、返回数据 ：  新闻字典里列表、 总页数、当前页
    data = {
        "cur_coll_news_list": cur_coll_news_list,
        "current_page": current_page,
        "total_page": total_page
    }
    return render_template("news/user_collection.html", data=data)


@profile_blu.route("/news_list", methods=["GET"])
@get_login_data
def news_list():
    """
    渲染用户发布过的新闻页面   GET


    1、获取参数、校验参数
    2、查询数据库 分页查询
    3、新闻数据模型对象列表转换成字典列表
    4、返回数据 ：  新闻字典里列表、 总页数、当前页
    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")
    # 1、获取参数、校验参数
    p = request.args.get("p", 1)
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1

    # 2、查询数据库分页查询
    cur_news_list = []
    current_page = 1
    total_page = 1
    try:
        paginate = News.query.filter(News.user_id==user.id).order_by(News.create_time.desc()).paginate(p, constants.USER_NEWS_PAGE_MAX_COUNT, False)
        cur_news_list = paginate.items  # 当前页数据
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    # 3、新闻数据模型对象列表转换成字典列表
    cur_user_news_list = []
    for i in cur_news_list:
        cur_user_news_list.append(i.to_review_dict())

    # 4、返回数据 ：  新闻字典里列表、 总页数、当前页
    data = {
        "cur_user_news_list": cur_user_news_list,
        "current_page": current_page,
        "total_page": total_page
    }
    return render_template("news/user_news_list.html", data=data)


@profile_blu.route("/news_release", methods=["POST", "GET"])
@get_login_data
def news_release():
    """
    渲染发布新闻页面   GET


    处理发布新闻请求  POST
    1、获取参数判空
    2、上传图片文件到骑牛
    3、创建新闻模型对象  News()  字段先赋值  status 1
    4、提交数据
    5、返回成功

    """

    # 获取登录用户信息
    user = g.user
    if not user:
        # 重定向到首页
        return redirect("/")

    if request.method == "GET":
        try:
            categories = Category.query.all()
        except Exception as e:
            current_app.logger.error(e)


        data = {
            "user_info": user.to_dict() if user else None,
            "categories":categories
        }
        return render_template("news/user_news_release.html", data=data)

    # POST
    # 1、获取参数判空
    data_dict = request.form
    title = data_dict.get("title")
    category_id = data_dict.get("category_id")
    index_image = request.files.get("index_image")
    digest = data_dict.get("digest")
    content = data_dict.get("content")

    if not all([title, category_id, index_image, digest, content]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        index_image = index_image.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg="参数错误")
    # 2、上传图片文件到骑牛
    try:
        pic_url_key = storage(index_image)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="图片上传出错")

    # 3、创建新闻模型对象News()字段先赋值status
    news = News()
    news.title = title
    news.category_id = int(category_id)
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + pic_url_key
    news.digest = digest
    news.content = content
    news.status = 1
    news.user_id = user.id
    news.source = "个人发布"

    # 4、提交数据
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据库操作失败")
    # 5、返回成功
    return jsonify(errno=RET.OK,errmsg="发布成功，待审核")


@profile_blu.route('/followed_user')    # 只是展示我关注的用户，使用GET即可
@get_login_data
def followed_user():
    """实现展示我的关注"""
    # 1、获取用户登录信息，获取不到就重定向到首页
    user = g.user
    if not user:
        # 用户未登录，重定向到主页
        return redirect('/')
    # 2、获取参数(页码)
    p = request.args.get("p", 1)
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1

    # 3、分页查询我的关注# user.followed.paginate(), 获取当前页数据、当前页数、总页数
    followed_users = []
    current_page = 1
    total_page = 1
    try:
        paginate = user.followed.paginate(p, constants.USER_FOLLOWED_MAX_COUNT, False)
        followed_users = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    # 4、查出来的用户数据转成字典
    users_list = []
    for i in followed_users:
        users_list.append(i.to_dict())

    # 5、把数据返回给user_follow.html模板
    data = {
        "users_list": users_list,
        "current_page": current_page,
        "total_page": total_page
    }
    return render_template("news/user_follow.html", data=data)